/*
 * @Description: 启动时收集机器信息
 *               检查 CPU 是否支持 64 位的工作模式
 *               收集内存布局信息
 *               设置操作系统需要的 MMU 页表
 *               设置显卡模式
 *               释放中文字体文件
 * @Author: insight21
 * @Date: 2021/08/12
 */
#include "cmctl.h"

// 在 1MB 内存地址处初始化机器信息结构
void machbstart_t_init(machbstart_t* init)
{
    // 清零
    memset(init, 0, sizeof(machbstart_t));
    // 设置标志
    init->mb_migc=MBS_MIGC;
}

void init_bstartparm()
{
    machbstart_t* mbsp = MBSPADR;
    // 初始化机器信息结构
    machbstart_t_init(mbsp);
    // 检查 CPU
    init_chkcpu(mbsp);
    // 检查内存
    init_mem(mbsp);
    if (0 == get_wt_imgfilesz(mbsp)) {
        kerror("imgfilesz 0");
    }
    // 初始化栈
    init_krlinitstack(mbsp);
    // 放置内核文件 & 字体文件
    init_krlfile(mbsp);
    init_defutfont(mbsp);
    // 安置内存信息
    init_meme820(mbsp);
    // 初始化页表数据
    init_bstartpages(mbsp);
    // 图形模式
    init_graph(mbsp);
}

int adrzone_is_ok(u64_t sadr, u64_t slen, u64_t kadr, u64_t klen)
{
    if (kadr >= sadr && kadr <= (sadr + slen))
    {
        return -1;
    }
    /*if(kadr<=sadr&&((kadr+klen)>=(sadr+slen)))
    {
        return -2;
    }*/
    if (kadr <= sadr && ((kadr + klen) >= sadr))
    {
        return -2;
    }

    return 0;
}

int chkadr_is_ok(machbstart_t *mbsp, u64_t chkadr, u64_t cksz)
{
    //u64_t len=chkadr+cksz;
    if (adrzone_is_ok((mbsp->mb_krlinitstack - mbsp->mb_krlitstacksz), mbsp->mb_krlitstacksz, chkadr, cksz) != 0)
    {
        return -1;
    }
    if (adrzone_is_ok(mbsp->mb_imgpadr, mbsp->mb_imgsz, chkadr, cksz) != 0)
    {
        return -2;
    }
    if (adrzone_is_ok(mbsp->mb_krlimgpadr, mbsp->mb_krlsz, chkadr, cksz) != 0)
    {
        return -3;
    }
    if (adrzone_is_ok(mbsp->mb_bfontpadr, mbsp->mb_bfontsz, chkadr, cksz) != 0)
    {
        return -4;
    }
    if (adrzone_is_ok(mbsp->mb_e820padr, mbsp->mb_e820sz, chkadr, cksz) != 0)
    {
        return -5;
    }
    if (adrzone_is_ok(mbsp->mb_memznpadr, mbsp->mb_memznsz, chkadr, cksz) != 0)
    {
        return -6;
    }
    if (adrzone_is_ok(mbsp->mb_memmappadr, mbsp->mb_memmapsz, chkadr, cksz) != 0)
    {
        return -7;
    }
    return 0;
}